Primeros pasos

por Manuel Diago García


Publicado el 27 de Febrero de 2017 a las 20:00



Descarga y uso de la librería con Visual Studio

En primer lugar, tenéis que descargar una copia del archivo EasySII.dll, lo cual podéis hacer desde aquí mismo.

Una vez descargado el archivo EasySII.zip lo descomprimís y ya tenéis la librería EasySII.dll para poder referenciarla en vuestros proyectos.

En el explorador de soluciones mediante la opción añadir referencia, pulsáis examinar y seleccionáis la librería EasySII.dll de la ubicación dónde la hayáis almacenado.

En las siguientes imágenes se observa cómo se añade una referencia a la librería en Visual Studio 2015:




Una vez hayamos añadido la referencia a la biblioteca en nuestro proyecto, podemos empezar a utilizar la librería. Para el desarrollo de este tutorial vamos a crear dos proyectos sobre los cuales iremos trabajando y desarrollando los ejemplos. Un proyecto será en C# y tendrá el nombre de TutorialEasySII; Y el otro proyecto será en VB y tendrá el nombre de TutorialVbEasySII. Para utilizar los servicios Web de la AEAT necesitamos utilizar un certificado digital; y éste, como norma general, debe estar emitido a nombre de la persona física o jurídica que figurará como titular de los envíos (de lo contrario el servicio web de la AEAT nos devolverá un error, diciendo que el certificado no coincide con el titular, y tampoco es de colaborador social…).

Siendo así, el primer paso que debemos realizar para utilizar EasySII es configurar el certificado digital que vamos a utilizar para nuestras comunicaciones con la AEAT.

Para ver como trabajar con la configuración de EasySII vamos a crear el proyecto que deseemos: o bien el proyecto en C# TutorialEasySII o bien el proyecto en VB TutorialVbEasySII. Una vez creado nuestro proyecto le añadiremos un formulario con el nombre formSettings.

En el proyecto de VB añadiremos el import correspondiente quedando el código del formulario como sigue:

Imports EasySII
Public Class formSettings
    Private Sub formSettings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MsgBox(Settings.Current.CertificateSerial)
    End Sub
End Class

En el proyecto de C# añadiremos el using correspondiente quedando el código del formulario como sigue:

using System;
using System.Windows.Forms;
using EasySII;
namespace TutorialEasySII
{
    public partial class formSettings : Form
    {
        public formSettings()
        {
            InitializeComponent();
        }
        private void formSettings_Load(object sender, EventArgs e)
        {
            MessageBox.Show(Settings.Current.CertificateSerial);
        }
    }
}

Para acceder a la configuración de EasySII se tiene que utilizar EasySII.Settings.Current. En esta propiedad de la clase Settings se almacena la configuración en curso o actual que está utilizando la biblioteca. Para acceder al número de serie del certificado a utilizar para las comunicaciones debemos consultar la propiedad Settings.Current.CertificateSerial.

Para consultar el valor que viene por defecto en la biblioteca, y que es el número de serie del certificado que se ha utilizado para las pruebas añadiremos en el evento load de nuestro formulario:

VB

    MsgBox(Settings.Current.CertificateSerial)

C#

    MessageBox.Show(Settings.Current.CertificateSerial);



EasySII.Settings.Current es la propiedad que debemos utilizar para cambiar la configuración en tiempo de ejecución. La configuración se almacena en un archivo xml en la carpeta de datos de programa con el nombre EasySII.xml. La carpeta de datos de programa de mi equipo está en la ruta 'C:\ProgramData\EasySII' y la ruta del archivo de configuración es ''C:\ProgramData\EasySII\EasySII.xml'.
Aquí abajo podemos ver un archivo de configuración de ejemplo:

<EasySIISettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <IDVersionSii>0.5</IDVersionSii>
    <InboxPath>C:\ProgramData\EasySII\Inbox\</InboxPath>
    <OutboxPath>C:\ProgramData\EasySII\Outbox\</OutboxPath>
    <CertificateSerial>3D327B0B</CertificateSerial>
</EasySIISettings>

Una manera de configurar el certirficado digital que queremos utilizar es editando manualmente este archvo de configuración. Podemos consultar mediante Internet Explorer, Chrome u otro, el número de serie del certificado a utilizar , e incluirlo manualmente en el archivo de configuración.

Como ejemplo, vamos a modificar la configuración del certificado a utilizar, directamente en el archivo de configuración. Primero, consulto mediante el explorador Chrome el número de serie del certificado que quiero utilizar. Seleccionamos la opción 'Configuración'.



Luego bajamos hasta la opción 'Mostrar configuración avanzada'.



Luego bajamos hasta la opción 'Administrar Certificados'.



Hacemos doble click sobre el certificado que deseamos utilizar para las comunicaciones; que recordemos que debe estar emitido a nombre del titular de los envíos que deseamos realizar a la AEAT mediante el SII.



En la pestaña 'Detalles' podemos consultar el número de serie del certificado. En el archivo de configuración deberemos incluir ese número de serie con letras mayúsculas y sin espacios.



En el ejemplo deberíamos anotar 3A6888878CF31EFB, y el archivo de configuración quedaría del siguiente modo:

<EasySIISettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <IDVersionSii>0.5</IDVersionSii>
    <InboxPath>C:\ProgramData\EasySII\Inbox\</InboxPath>
    <OutboxPath>C:\ProgramData\EasySII\Outbox\</OutboxPath>
    <CertificateSerial>3A6888878CF31EFB</CertificateSerial>
</EasySIISettings>

Si lo que queremos es gestionar la configuración en tiempo de ejecución, podéis descargar el proyecto de ejemplo del tutorial en VB aquí, o el proyecto en C# aquí.


Introducción

por Manuel Diago García


Publicado el 04 de Marzo de 2017 a las 12:05



¿Qué hace la librería .net EasySII?

La librería EasySII está diseñada para ayudar en la realización de dos funciones:

  • Serialización XML: Soporte para la serialización de facturas emitidas, recibidas, bienes de inversión... en el formato xml requerido por las especificaciones de la AEAT.

  • Comunicaciones: Soporte para las comunicaciones con la AEAT, facilitando el envío y recepción de mensajes. Todo mensaje enviado y recibido queda almacenado en los directorios especificados en el fichero de configuración como directorio para almacenar los mensajes enviados, y el directorio para almacenar los mensajes recibidos.

EasySII ha sido diseñada para simplificar las labores de serialización xml. Utilizando los objetos de la capa de negocio podemos obtener fácilmente los mensajes SOAP para enviar a la AEAT mediante los servicios web habilitados para el SII.

Las funcionalidades de envío a la AEAT se pueden utilizar llamándolas directamente desde los objetos de la capa de negocios: Por ejemplo, creamos un lote de facturas emitidas mediante la capa de negocios y llamamos al método de envío pasándole el lote de facturas como parámetro.
Por otro lado también podemos cargar los xml generados mediante otros procedimientos y utilizar el método de envío a la AEAT, tratando el mensaje de respuesta recibido de la misma.

Facturas Emitidas

por Manuel Diago García


Publicado el 10 de Marzo de 2017 a las 12:10



Envío de facturas emitidas

En este tema veremos como utilizar EasySII para el envío de lotes de facturas recibidas. En la primera parte veremos como componer lotes de facturas emitidas utilizando los objetos del espacio de nombres Business.
En la segunda parte veremos como realizar el envío del xml generado en la primera parte, y recibir la respuesta de la AEAT.

Para crear un lote de facturas emitidas utilizaremos la clase ARInvoicesBatch (lote de facturas emitidas). Para utlizar esta clase debemos incluir el espacio de nombres Business:

VB

Imports EasySII.Business

C#

using EasySII.Business;

Debemos crear nueva instancia de la clase ARInvoicesBatch, que representa un lote de facturas emitidas. Mediante la instancia creada de ARInvoicesBatch debemos ir incluyendo los datos necesarios para generar el XML. En primer lugar asignaremos el titular del envío.

VB

    
        ' Creamos un lote de facturas recibidas
        Dim LoteDeFacturasEmitidas As ARInvoicesBatch = New ARInvoicesBatch()
        
        ' Creamos el titular del envío
        Dim titular As Party = New Party()
        titular.TaxIdentificationNumber = "B12959755"
        titular.PartyName = "IRENE SOLUTIONS SL"
        LoteDeFacturasEmitidas.Titular = titular
        LoteDeFacturasEmitidas.CommunicationType = CommunicationType.A0 ' alta facturas:
        ' utilizando el tipo de comunicación podemos modificar datos de facturas envíadas
        ' anteriormente. En lugar de alta de facturas, podemos elegir modificación.

C#

    
            // Creamos un lote de facturas recibidas
            ARInvoicesBatch LoteDeFacturasEmitidas = new ARInvoicesBatch();
    
        // Creamos el titular del envío
        Party titular = new Party()
        {
            TaxIdentificationNumber =
            "B12959755",
            PartyName = "IRENE SOLUTIONS SL"
        };
                      
        LoteDeFacturasEmitidas.Titular = titular;           
        LoteDeFacturasEmitidas.CommunicationType = CommunicationType.A0; // alta facturas:
        // utilizando el tipo de comunicación podemos modificar datos de facturas envíadas
        // anteriormente. En lugar de alta de facturas, podemos elegir modificación.

Una vez hemos creado el lote de facturas emitidas, y asignado el titular, podemos comenzar a añadir facturas a la colección ARInvoices. Esta colección recoge todas las facturas pertenecientes al lote.

VB

    ' Creo las facturas y las anexo al lote
        ' Consideramos que el titular del envío también es el emisor de las facturas
        Dim emisor As Party = titular

        Dim facturaEnviadaPrimera As ARInvoice = New ARInvoice() ' Nueva factura

        facturaEnviadaPrimera.IssueDate = New DateTime(2017, 1, 15) ' Fecha factura
        facturaEnviadaPrimera.SellerParty = emisor ' Emisor factura

        facturaEnviadaPrimera.BuyerParty = New Party() ' Cliente
        facturaEnviadaPrimera.BuyerParty.TaxIdentificationNumber = "B12756474"
        facturaEnviadaPrimera.BuyerParty.PartyName = "MAC ORGANIZACION SL"

        facturaEnviadaPrimera.InvoiceNumber = "FR0001" ' Número de factura
        facturaEnviadaPrimera.InvoiceType = InvoiceType.F1 ' Factura normal
        facturaEnviadaPrimera.ClaveRegimenEspecialOTrascendencia =
                ClaveRegimenEspecialOTrascendencia.RegimenComun ' Regimen común
        facturaEnviadaPrimera.GrossAmount = 55 ' Importe bruto
        facturaEnviadaPrimera.InvoiceText = "Licencia software" ' Descripción
        ' SI NO AÑADIMOS LÍNEAS DE IVA COGE EL IMPORTE BRUTO COMO BASE EXENTA

        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaPrimera) ' Añadimos la nueva factura al lote

C#

            
        // Creo las facturas y las anexo al lote
        //  Consideramos que el titular del envío también es el emisor de las facturas
        Party emisor = titular;

        ARInvoice facturaEnviadaPrimera = new ARInvoice(); // Nueva factura

        facturaEnviadaPrimera.IssueDate = new DateTime(2017, 1, 15); // Fecha factura
        facturaEnviadaPrimera.SellerParty = emisor; // Emisor factura

        facturaEnviadaPrimera.BuyerParty = new Party() // Cliente
        {
            TaxIdentificationNumber =
            "B12756474",
            PartyName = "MAC ORGANIZACION SL"
        };

        facturaEnviadaPrimera.InvoiceNumber = "FR0001"; // Número de factura
        facturaEnviadaPrimera.InvoiceType = InvoiceType.F1; // Factura normal
        facturaEnviadaPrimera.ClaveRegimenEspecialOTrascendencia =
            ClaveRegimenEspecialOTrascendencia.RegimenComun; // Regimen común
        facturaEnviadaPrimera.GrossAmount = 55m; // Importe bruto
        facturaEnviadaPrimera.InvoiceText = "Licencia software"; // Descripción
        // SI NO AÑADIMOS LÍNEAS DE IVA COGE EL IMPORTE BRUTO COMO BASE EXENTA

        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaPrimera); // Añadimos la nueva factura al lote

Si al asignar a la propiedad 'BuyerParty' un objeto 'Party' con un NIF de no residente (comenzado por 'N') o con un NIF que el programa no reconoce como un NIF o CIF español, serializará la factura con un xml que incluirá el detalle por tipo operación (en este detalle se debe distinguir entre prestación de servicio o entrega de bienes). Si es este el caso, el objeto ARInvoice que representa una factura emitida, disponse de la propiedad IsService, cuyo valor indica si la serailización se debe hacer como prestación de servicios. El valor por defecto es false, y la serialización por defecto, por tanto, como entrega de bienes.

Si al asignar a la propiedad 'BuyerParty' un objeto 'Party' con un NIF NIF que el programa no reconoce como un NIF o CIF español, serializará el tipo contraparte informando en IDOtro el identificador fiscal, y se deberá notificar el valor de la propiedade CountryCode con el código ISO de pais correspondiente. En estos casos el objeto ARInvoice que representa una factura emitida utilizará el valor de su propiedad IDOtroType en la serialización. El valor por defecto de la propiedad IDOtroType es IDOtroType.OtroDocProbatorio. A continuación se muestra un ejemplo de factura creada de este modo.

VB

        Dim facturaEnviadaNifExtranjero As ARInvoice = New ARInvoice() ' Factura enviada

        facturaEnviadaNifExtranjero.IssueDate = New DateTime(2017, 1, 15) ' Fecha factura
        facturaEnviadaNifExtranjero.SellerParty = emisor ' El emisor de la factura
        facturaEnviadaNifExtranjero.CountryCode = "US"

        facturaEnviadaNifExtranjero.BuyerParty = New Party() ' El cliente
        facturaEnviadaNifExtranjero.BuyerParty.TaxIdentificationNumber = "NIF_EXTRANJERO"
        facturaEnviadaNifExtranjero.BuyerParty.PartyName = "CLIENTE EXTRANJERO LTD"

        facturaEnviadaNifExtranjero.InvoiceNumber = "FR0002" ' El número de factura
        facturaEnviadaNifExtranjero.InvoiceType = InvoiceType.F1 ' Factura normal
        facturaEnviadaNifExtranjero.ClaveRegimenEspecialOTrascendencia = ClaveRegimenEspecialOTrascendencia.RegimenComun

        facturaEnviadaNifExtranjero.GrossAmount = 231 ' Importe bruto
        facturaEnviadaNifExtranjero.InvoiceText = "Servicios consultoria" ' Descripción

        ' Añadimos la factura al lote
        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaNifExtranjero)

C#

        ARInvoice facturaEnviadaNifExtranjero = new ARInvoice(); // Factura enviada

        facturaEnviadaNifExtranjero.IssueDate = new DateTime(2017, 1, 15); // Fecha factura
        facturaEnviadaNifExtranjero.SellerParty = emisor; // El emisor de la factura
        facturaEnviadaNifExtranjero.CountryCode = "US";

        facturaEnviadaNifExtranjero.BuyerParty = new Party() // El cliente
        {
            TaxIdentificationNumber =
            "NIF_EXTRANJERO",
            PartyName = "CLIENTE EXTRANJERO LTD"
        };

        facturaEnviadaNifExtranjero.InvoiceNumber = "FR0002"; // El número de factura
        facturaEnviadaNifExtranjero.InvoiceType = InvoiceType.F1; // Factura normal
        facturaEnviadaNifExtranjero.ClaveRegimenEspecialOTrascendencia = 
        ClaveRegimenEspecialOTrascendencia.RegimenComun; 
        facturaEnviadaNifExtranjero.GrossAmount = 231m; // Importe bruto
        facturaEnviadaNifExtranjero.InvoiceText = "Servicios consultoria"; // Descripción

         // Añadimos la factura al lote
        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaNifExtranjero);

Si en la factura no incluimos lineas de IVA, la serialización se realizará tomando el bruto factura como base exenta. La propiedad CausaExencion del objeto ARInvoice, determina el código de exención que se utilizará. El valor por defecto de esta propiedad es 'E1' (Exenta por el artículo 20). Si incluimos líneas de IVA la serialización se realizará incluyendo las mismas en el detalle correspondiente.

VB

        Dim facturaEnviadaConLineasIva As ARInvoice = New ARInvoice() ' Factura

        facturaEnviadaConLineasIva.IssueDate = New DateTime(2017, 1, 15) ' Fecha factura
        facturaEnviadaConLineasIva.SellerParty = emisor ' El emisor de la factura

        facturaEnviadaConLineasIva.BuyerParty = New Party() ' El cliente
        facturaEnviadaConLineasIva.BuyerParty.TaxIdentificationNumber = "B12756474"
        facturaEnviadaConLineasIva.BuyerParty.PartyName = "MAC ORGANIZACION SL"

        facturaEnviadaConLineasIva.InvoiceNumber = "FR0003" ' El número de factura
        facturaEnviadaConLineasIva.InvoiceType = InvoiceType.F1 ' Factura normal
        facturaEnviadaConLineasIva.ClaveRegimenEspecialOTrascendencia = ClaveRegimenEspecialOTrascendencia.RegimenComun
        facturaEnviadaConLineasIva.GrossAmount = 231 ' Importe bruto
        facturaEnviadaConLineasIva.InvoiceText = "Servicios consultoria" ' Descripción

        ' Añadimos las líneas de IVA
        facturaEnviadaConLineasIva.AddTaxOtuput(21, 100, 21)
        facturaEnviadaConLineasIva.AddTaxOtuput(10, 100, 10)

        ' Añadimos la factura al lote
        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaConLineasIva)

C#

        ARInvoice facturaEnviadaConLineasIva = new ARInvoice(); // Factura

        facturaEnviadaConLineasIva.IssueDate = new DateTime(2017, 1, 15); // Fecha factura
        facturaEnviadaConLineasIva.SellerParty = emisor; // El emisor de la factura

        facturaEnviadaConLineasIva.BuyerParty = new Party() // El cliente
        {
            TaxIdentificationNumber =
            "B12756474",
            PartyName = "MAC ORGANIZACION SL"
        };

        facturaEnviadaConLineasIva.InvoiceNumber = "FR0003"; // El número de factura
        facturaEnviadaConLineasIva.InvoiceType = InvoiceType.F1; // Factura normal
        facturaEnviadaConLineasIva.ClaveRegimenEspecialOTrascendencia = 
        ClaveRegimenEspecialOTrascendencia.RegimenComun; 
        facturaEnviadaConLineasIva.GrossAmount = 231m; // Importe bruto
        facturaEnviadaConLineasIva.InvoiceText = "Servicios consultoria"; // Descripción
            
        // Añadimos las líneas de IVA
        facturaEnviadaConLineasIva.AddTaxOtuput(21m, 100m, 21m); 
        facturaEnviadaConLineasIva.AddTaxOtuput(10m, 100m, 10m);

        // Añadimos la factura al lote
        LoteDeFacturasEmitidas.ARInvoices.Add(facturaEnviadaConLineasIva); 

Una vez tengamos añadidas todas las facturas que componen el lote podemos realizar el envío a la AEAT. Para ello utilizaremos el método estático SendFacturasEmitidas de la clase Wsd. La clase Wsd está en el espacio de nombres EasySII.Net, por lo que deberemos incluir este espacio de nombres en nuestro código.

VB

Imports EasySII.Net

C#

using EasySII.Net;

La llamada al método estático SendFacturasEmitidas de la clase Wsd la realizaremos pasándole el lote de facturas que queremos enviar.

VB

    
        ' Realizamos el envío del lote a la AEAT
        Dim xmlResponse As String = Wsd.SendFacturasEmitidas(LoteDeFacturasEmitidas)
    
            ' Guardo la respuesta en un archivo
        File.WriteAllText("C:\RespuestaAeat.xml", xmlResponse)

C#

        // Realizamos el envío del lote a la AEAT
        string xmlResponse =  Wsd.SendFacturasEmitidas(LoteDeFacturasEmitidas);

        // Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse);

También podemos generar el xml para la aeat en un archivo guardado en disco, llamando al método GetXml del objeto ARInvoicesBatch.

VB

        
        ' Genera el archivo xml y lo guarda en la ruta facilitada comno parámetro         
        LoteDeFacturasEmitidas.GetXml("C:\LoteFacturasEmitidas.xml")    

C#

        // Genera el archivo xml y lo guarda en la ruta facilitada comno parámetro
        LoteDeFacturasEmitidas.GetXml("C:\\LoteFacturasEmitidas.xml");

También podemos cargar un archivo generado previamente, o bien generado por otra aplicación, y enviarlo a la AEAT llamando al método estático Send de la clase Wsd. Para ello deberemos utilizar la clase Envelope (que representa un sobre SOAP) para cargar el archivo xml, y pasarla como argumento al método Send. La clase Envelope se encuentra en el espacio de nombres EasySII.Xml.Soap.

VB

        ' Cargamos el archivo en una nueva instancia de la clase Envelope
        Dim envelope As Envelope = New Envelope("C:\\LoteFacturasEmitidas.xml")

        If IsNothing(envelope.Body.SuministroLRFacturasEmitidas) Then
            MessageBox.Show("No es un lote de facturas emitidas.")
            Return
        End If

        ' Realizamos el envío y guardamos la respuesta de la AEAT
        Dim xmlResponse As String = Wsd.Send(envelope)

        ' Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse)

C#

        // Cargamos el archivo en una nueva instancia de la clase Envelope
        Envelope envelope = new Envelope("C:\\LoteFacturasEmitidas.xml");
        if (envelope.Body.SuministroLRFacturasEmitidas == null)
        {
            MessageBox.Show("No es un lote de facturas emitidas.");
            return;
        }
        // Realizamos el envío y guardamos la respuesta de la AEAT
        string xmlResponse =  Wsd.Send(envelope);
        // Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse);

Operaciones Intracomunitarias

por Julio Carballo Alomar


Publicado el 5 de Abril de 2017 a las 09:10



Envío de operaciones intracomunitarias

Una vez que hemos visto como proceder par el envío tanto de las facturas emitidas como de las recibidas, en este tema veremos cómo utilizar la librería para el envío de lotes de operaciones intracomunitarias.
Como en los otros temas, primero veremos cómo componer el lote utilizando los objetos del espacio de nombres Business y después veremos cómo realizar el envío de dicho lote y recibir la respuesta por parte de la AEAT.

Para crear el lote de operaciones intracomunitarias, utilizaremos la clase ITInvoicesBatch (lote operaciones intracomunitarias). Al igual que en los otros lotes, deberemos incluir el espacio de nombres Business:

VB

Imports EasySII.Business

C#

using EasySII.Business;

Debemos crear nueva instancia de la clase ITInvoicesBatch, que representa un lote de operaciones intracomunitarias. Mediante la instancia creada de ITInvoicesBatch debemos ir incluyendo los datos necesarios para generar el XML. En primer lugar asignaremos el titular del envío.

VB

                
        ' Creamos un lote de operaciones intracomunitarias
            Dim LoteDeOperIntracom As ITInvoicesBatch = New ITInvoicesBatch()
                
        ' Creamos el titular del envío
        Dim titular As Party = New Party()
        titular.TaxIdentificationNumber = "B12959755"
        titular.PartyName = "IRENE SOLUTIONS SL"
        LoteDeOperIntracom.Titular = titular
        LoteDeOperIntracom.CommunicationType = CommunicationType.A0 ' alta
        

C#

                
         // Creamos un lote de operaciones intracomunoitaria
        ITInvoicesBatch LoteDeOperIntracom = new ITInvoicesBatch();
                
        // Creamos el titular del envío
        Party titular = new Party()
        {
            TaxIdentificationNumber =
            "B12959755",
            PartyName = "IRENE SOLUTIONS SL"
        };
                      
         LoteDeOperIntracom.Titular = titular;           
         LoteDeOperIntracom.CommunicationType = CommunicationType.A0; // alta 

Una vez hemos creado el lote de operaciones intracomunitarias, y asignado el titular, podemos comenzar a añadir facturas a la colección ITInvoices. Esta colección recoge todas las facturas pertenecientes al lote. Cabe destacar de que como se pueden tratar de operaciones intracomunitarias de facturas emitidas o recibidas, habrá que informar el BuyerParty y el SellerParty según corresponda. En el ejemplo que ponemos a continuación, se trata de una operación sobre una factura emitida, en este caso el BuyerParty será el mismo que el titular del lote.

VB

        ' Creo las facturas y las anexo al lote
        ' Consideramos que el titular del envío también es el emisor de las facturas
        Dim emisor As Party = titular
        Dim facturaEnviadaPrimera As ITInvoice = New ITInvoice()' Nueva factura
        facturaEnviadaPrimera.IssueDate = New DateTime(2017, 1, 15) ' Fecha factura
        facturaEnviadaPrimera.BuyerParty  = emisor ' Emisor factura

        facturaEnviadaPrimera.SellerParty = New Party()' Cliente
        facturaEnviadaPrimera.BuyerParty.TaxIdentificationNumber = "B12756474"
        facturaEnviadaPrimera.BuyerParty.PartyName = "MAC ORGANIZACION SL"

        facturaEnviadaPrimera.InvoiceNumber = "FR0001" ' Número de factura
        facturaEnviadaPrimera.OperationType = OperationType.A ' Factura normal
        facturaEnviadaPrimera.ClaveDeclarado = ClaveDeclarado.D ' Regimen común
        facturaEnviadaPrimera.EstadoMiembro = "ES"' En este caso hay que indicar el Estado
        de la U.E. a la que pertenece el cliente con el que hemos realizado la operación

        facturaEnviadaPrimera.DescripcionBienes = "Descripción de los bienes"' Descripción
        facturaEnviadaPrimera.DireccionOperador = "Dirección del operador" 

        LoteDeOperIntracom.ITInvoices.Add(facturaEnviadaPrimera) ' Añadimos la nueva factura al lote

C#

        
        // Creo las facturas y las anexo al lote
        //  Consideramos que el titular del envío también es el emisor de las facturas
        Party emisor = titular;
        ITInvoice  facturaEnviadaPrimera = new ITInvoice(); // Nueva factura
        facturaEnviadaPrimera.IssueDate = new DateTime(2017, 1, 15); // Fecha factura
        facturaEnviadaPrimera.BuyerParty = emisor; // Emisor factura
        facturaEnviadaPrimera.SellerParty  = new Party() // Cliente
        {
            TaxIdentificationNumber =
            "B12756474",
            PartyName = "MAC ORGANIZACION SL"
        };
        facturaEnviadaPrimera.InvoiceNumber = "FR0001"; // Número de factura
        facturaEnviadaPrimera.OperationType = OperationType.A;
        facturaEnviadaPrimera.ClaveDeclarado = ClaveDeclarado.D;
        facturaEnviadaPrimera.EstadoMiembro = "ES" ; // En este caso hay que indicar el 
        Estado de la U.E. a la que pertenece el cliente con el que hemos realizado la operación
        facturaEnviadaPrimera.DescripcionBienes = "Descripción de los bienes"; 
        facturaEnviadaPrimera.DireccionOperador = "Dirección del operador";
        LoteDeOperIntracom.ITInvoices.Add(facturaEnviadaPrimera); // Añadimos la nueva factura al lote

Si al asignar tanto a la propiedad 'BuyerParty' como a la propiedad ‘SellerParty’ un objeto 'Party' con un NIF que el programa no reconoce como un NIF o CIF español, serializará el tipo contraparte informando en IDOtro el identificador fiscal, y se deberá notificar el valor de la propiedade CountryCode con el código ISO de país correspondiente. En estos casos el objeto ITInvoice que representa una operación intracomunitaria utilizará el valor de su propiedad IDOtroType en la serialización. El valor por defecto de la propiedad IDOtroType es IDOtroType.OtroDocProbatorio. A continuación se muestra un ejemplo de factura creada de este modo.

VB

        Dim operIntracomNifExtranjero  As ITInvoice  = New ITInvoice() ' Factura enviada
        operIntracomNifExtranjero.IssueDate = New DateTime(2017, 1, 15) ' Fecha factura
        operIntracomNifExtranjero.BuyerParty  = emisor ' El emisor de la factura
        operIntracomNifExtranjero.CountryCode = "DK"
        operIntracomNifExtranjero.SellerParty  = New Party() ' El cliente
        operIntracomNifExtranjero.SellerParty .TaxIdentificationNumber = "DK12345678"
        operIntracomNifExtranjero.SellerParty .PartyName = "CLIENTE EXTRANJERO LTD"
        operIntracomNifExtranjero.InvoiceNumber = "FR0002" ' El número de factura

        operIntracomNifExtranjero.OperationType = OperationType ' Tipo operación
        operIntracomNifExtranjero.ClaveDeclarado = ClaveDeclarado.D

        operIntracomNifExtranjero.EstadoMiembro = "DK" ' En este caso el 
        Estado de la U.E. coincidiría con el CountryCode
        operIntracomNifExtranjero.DescripcionBienes = "Descripción de los bienes"' Descripción
        operIntracomNifExtranjero.DireccionOperador = "Dirección del Operador"
        ' Añadimos la factura al lote
        LoteDeOperIntracom.ITInvoices.Add(operIntracomNifExtranjero)

C#

        ITInvoice  operIntracomNifExtranjero  = new ITInvoice(); // Oper. Intracom
        operIntracomNifExtranjero.IssueDate = new DateTime(2017, 1, 15); // Fecha factura
        operIntracomNifExtranjero.BuyerParty = emisor; // El emisor de la factura
        operIntracomNifExtranjero.CountryCode = "DK";
        operIntracomNifExtranjero.SellerParty  = new Party() // El cliente
        {
            TaxIdentificationNumber =
            "DK12345678",
            PartyName = "CLIENTE EXTRANJERO LTD"
        };
        operIntracomNifExtranjero.InvoiceNumber = "FR0002"; // El número de factura
        operIntracomNifExtranjero.OperationType = OperationType.A; // Factura normal
        operIntracomNifExtranjero.ClaveDeclarado = ClaveDeclarado.D; 
        operIntracomNifExtranjero.EstadoMiembro = "DK"; // En este caso el 
        Estado de la U.E. coincidiría con el CountryCode

        operIntracomNifExtranjero.DescripcionBienes = "Descripción de los bienes"; 
        operIntracomNifExtranjero.DireccionOperador = "Dirección del Operador"

        LoteDeOperIntracom.ITInvoices.Add(operIntracomNifExtranjero);

Una vez tengamos añadidas todas las operaciones que componen el lote podemos realizar el envío a la AEAT. Para ello utilizaremos el método estático SendOperIntracom de la clase Wsd. La clase Wsd está en el espacio de nombres EasySII.Net, por lo que deberemos incluir este espacio de nombres en nuestro código.

VB

Imports EasySII.Net

C#

using EasySII.Net;

La llamada al método estático SendOperIntracom de la clase Wsd la realizaremos pasándole el lote de operaciones que queremos enviar.

VB

                
        ' Realizamos el envío del lote a la AEAT
        Dim xmlResponse As String = Wsd.SendOperIntracom(LoteDeOperIntracom)
                
            ' Guardo la respuesta en un archivo
        File.WriteAllText("C:\RespuestaAeat.xml", xmlResponse)

C#

                // Realizamos el envío del lote a la AEAT
        string xmlResponse =  Wsd.SendOperIntracom(LoteDeOperIntracom);
                // Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse);

También podemos generar el xml para la aeat en un archivo guardado en disco, llamando al método GetXml del objeto ITInvoicesBatch.

VB

                
        ' Genera el archivo xml y lo guarda en la ruta facilitada comno parámetro         
        LoteDeFacturasEmitidas.GetXml("C:\LoteOperIntracom.xml")    

C#

                // Genera el archivo xml y lo guarda en la ruta facilitada comno parámetro
            LoteDeOperIntracom.GetXml("C:\\LoteOperIntracom.xml");

También podemos cargar un archivo generado previamente, o bien generado por otra aplicación, y enviarlo a la AEAT llamando al método estático Send de la clase Wsd. Para ello deberemos utilizar la clase Envelope (que representa un sobre SOAP) para cargar el archivo xml, y pasarla como argumento al método Send. La clase Envelope se encuentra en el espacio de nombres EasySII.Xml.Soap.

VB

                ' Cargamos el archivo en una nueva instancia de la clase Envelope
        Dim envelope As Envelope = New Envelope("C:\\LoteOperIntracom.xml")
        If IsNothing(envelope.Body.SuministroLRDetOperacionIntracomunitaria) Then
            MessageBox.Show("No es un lote de operaciones intracomunitarias.")
            Return
        End If
                ' Realizamos el envío y guardamos la respuesta de la AEAT
        Dim xmlResponse As String = Wsd.Send(envelope)
                ' Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse)

C#

                // Cargamos el archivo en una nueva instancia de la clase Envelope
        Envelope envelope = new Envelope("C:\\LoteFacturasEmitidas.xml");
        if (envelope.Body.SuministroLRDetOperacionIntracomunitaria == null)
        {
            MessageBox.Show("No es un lote de operaciones intracomunitarias.");
            return;
        }
                // Realizamos el envío y guardamos la respuesta de la AEAT
        string xmlResponse =  Wsd.Send(envelope);
                // Guardo la respuesta en un archivo
        File.WriteAllText("C:\\RespuestaAeat.xml", xmlResponse);

Objetivo

El objetivo del presente tutorial es ayudar a los desarrolladores en su comienzo con la utilización de la biblioteca .net EasySII. En él trataremos de explicar de la forma más sencilla posible cómo utilizar la herramienta.